package org.example.hansp.recursion;

import java.util.Random;

public class MiGong {
    private static final int[][] DIRECTIONS = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
    public static void main(String[] args) {
        int [][] map=new int[8][7];
        originMap(map);

      barrier(map);
        printMap(map);
        System.out.println("============================");
        findWay(map,1,1);
        printMap(map);
    }

    /**
     * 初始化地图的四周为障碍
     * 将四周初始化为1
     * @param map   二维数组作为地图
     */
    static void originMap(int[][] map) {
        for (int i=0;i<map.length-1;i++){
            map[0][i]=1;
            map[map.length-1][i]=1;
            map[i][0]=1;
            map[i][map[i].length-1]=1;
        }

    }

    /**
     * 随机制造障碍
     * @param map   二位数组作为地图
     */
    static void barrier(int[][] map) {
        Random rand = new Random();
        //随机生成障碍的行数和列数的大小区域
        int rows=map.length-2;
        int cols=map[0].length-2;

        //障碍物的占比数量
        int  numberOfObstacles = (int) (rows * cols *0.1 );
        for(int i=0;i<numberOfObstacles;i++){
            //随机生成障碍的行坐标和列坐标
            int row = rand.nextInt(rows)+1;
            int col = rand.nextInt(cols)+1;

//避免一个地方重复生成障碍||在老鼠初始位置和终点生成障碍
            while(map[row][col]==1||(row==1&&col==1)||(row==map.length-2&&col==map[0].length-2)){
                row = rand.nextInt(rows)+1;
                col = rand.nextInt(cols)+1;
            }
            //将坐标设置为1表示障碍
            map[row][col]=1;
        }


    }

    /**
     * 打印迷宫地图
     * @param map 二位数组作为地图
     */
    public static void printMap(int [][] map){
        for (int i=0;i<map.length;i++){
            for (int j=0;j<map[i].length;j++){
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }
    }

    /**
     * 老鼠出迷宫，寻找路径
     * @param map 地图
     * @param row 初始位置的行
     * @param column 初始位置的列
     * @return 路径
     * 1：障碍 2：路径 0：可走路径 3：已经走过发现走不通路径
     * 老鼠的起始位置为[1][1],终点为右下角最后一个为0的数
     */
    public static boolean findWay(int [][] map,int row,int column){

        if(map[map.length-2][map[0].length-2]==2){//已经到终点
            return true;
        }else {
            if(map[row][column]==0){
//                假设该路径能够走通
                map[row][column]=2;

              /*  if(findWay(map,row,column+1)){//向右走
                    return true;
                }else if(findWay(map,row+1,column)){//向下走
                    return true;
                }else if(findWay(map,row-1,column)){//向上走
                    return true;
                }else if(findWay(map,row,column-1)){//向左走
                    return true;
                }else{
                    //如果上下左右都走不同，说明此路不同
                    map[row][column]=3;
                    return false;
                }
            } else{
                //遇到障碍或已访问过
                return false;
            }*/
                for (int[] direction : DIRECTIONS) {
                    int newRow = row + direction[0];
                    int newCol = column + direction[1];

                    if (findWay(map, newRow, newCol)) {
                        return true;
                    }
                }

                map[row][column] = 3;
                return false;
            } else {
                return false;
            }


        }

    }
}
